import { Context, Next } from 'koa';
import jwt from 'jsonwebtoken';
import User from '../models/User';
import { redisClient } from '../database';

/**
 * 可选的认证中间件，如果有token则验证并设置用户信息，没有则继续
 * @param ctx Koa上下文
 * @param next 下一个中间件
 */
export const optionalAuthMiddleware = async (ctx: Context, next: Next) => {
  try {
    // 获取请求头中的token
    const authHeader = ctx.headers.authorization;
    
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      // 没有token或格式不正确，继续处理请求，但不设置用户信息
      return await next();
    }
    
    // 提取token
    const token = authHeader.split(' ')[1];
    
    // 检查token是否在黑名单中（已登出）
    const isBlacklisted = await redisClient.get(`blacklist:${token}`);
    if (isBlacklisted) {
      // token已失效，继续处理请求，但不设置用户信息
      return await next();
    }
    
    // 验证token
    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key') as any;
    
    // 获取用户信息
    const user = await User.findByPk(decoded.id, {
      attributes: { exclude: ['password'] }
    });
    
    if (!user) {
      // 用户不存在，继续处理请求，但不设置用户信息
      return await next();
    }
    
    // 设置用户信息到ctx.state
    ctx.state.user = user;
    
    await next();
  } catch (error) {
    // token验证失败，继续处理请求，但不设置用户信息
    await next();
  }
}; 